import dayjs from "dayjs";
import "dayjs/locale/zh-cn";

// 设置语言为中文
dayjs.locale("zh-cn");

/**
 * 格式化日期时间
 * @param {string|Date} date 日期对象或日期字符串
 * @param {string} format 格式化模式，默认为 YYYY-MM-DD HH:mm:ss
 * @returns {string} 格式化后的日期字符串
 */
export function formatDateTime(date, format = "YYYY-MM-DD HH:mm:ss") {
  if (!date) return "-";
  return dayjs(date).format(format);
}

/**
 * 格式化日期
 * @param {string|Date} date 日期对象或日期字符串
 * @param {string} format 格式化模式，默认为 YYYY-MM-DD
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = "YYYY-MM-DD") {
  if (!date) return "-";
  return dayjs(date).format(format);
}

/**
 * 格式化时间
 * @param {string|Date} date 日期对象或日期字符串
 * @param {string} format 格式化模式，默认为 HH:mm:ss
 * @returns {string} 格式化后的时间字符串
 */
export function formatTime(date, format = "HH:mm:ss") {
  if (!date) return "-";
  return dayjs(date).format(format);
}

/**
 * 智能格式化日期时间
 * 如果是今天，只显示时间；如果是今年，显示月日时间；否则显示完整日期时间
 * @param {string|Date} date 日期对象或日期字符串
 * @returns {string} 格式化后的日期时间字符串
 */
export function formatDateTimeAuto(date) {
  if (!date) return "-";

  const dateObj = dayjs(date);
  const now = dayjs();

  if (dateObj.isSame(now, "day")) {
    // 今天，只显示时间
    return dateObj.format("HH:mm:ss");
  } else if (dateObj.isSame(now, "year")) {
    // 今年，显示月日时间
    return dateObj.format("MM-DD HH:mm");
  } else {
    // 其他，显示完整日期时间
    return dateObj.format("YYYY-MM-DD HH:mm");
  }
}

/**
 * 获取相对时间（多久之前）
 * @param {string|Date} date 日期对象或日期字符串
 * @returns {string} 相对时间字符串
 */
export function fromNow(date) {
  if (!date) return "-";

  const dateObj = dayjs(date);
  const now = dayjs();

  const diffMinutes = now.diff(dateObj, "minute");

  if (diffMinutes < 1) {
    return "刚刚";
  } else if (diffMinutes < 60) {
    return `${diffMinutes}分钟前`;
  } else if (diffMinutes < 24 * 60) {
    return `${Math.floor(diffMinutes / 60)}小时前`;
  } else if (diffMinutes < 7 * 24 * 60) {
    return `${Math.floor(diffMinutes / (24 * 60))}天前`;
  } else {
    return formatDateTime(date);
  }
}

export default {
  formatDateTime,
  formatDate,
  formatTime,
  formatDateTimeAuto,
  fromNow,
};
